elastic search 全文检索知识学习

如何自学一门中间件

1.去官网找文档,guide/reference/api,文档通读一遍,搞清楚是什么?

2.不要去看源码,而是先demo一遍,知道流程和步骤,抽象模型,核心组件,运作原理.搞清楚为什么工具能达到目的?

3.场景是什么?结合场景和demo练习几次,想想是怎么回事?如何做到的?

4.越是低版本越是接近底层原理,越是接近底层就越能弄明白,其他API无非就是各语言的扩展.比如掌握了命令行,其他语言API就不用记

class1 es安装,配置

1.图形化工具 elastic search head,kibana

class2 es的基本概念

集群,节点

索引,类型,文档,分片,映射

关系型数据库(mysql) 面向文档elasticsearch
database indices
tables types
rows documents
dolumns fields

逻辑设计:

一个索引类型中,包含多个文档,当我们索引一篇文档时,可以通过这样的规则: 索引>类型>文档id,通过这个组合我们能索引到具体的文档.

索引

文档

文档包含字段和值,可以层级包含字段和值,JSON格式.

字段类型

类型是包含文档的上级节点,类型中对字段的定义是映射

==倒排索引??==

class3 ik分词器详解

安装分词器插件 :

ik_smart 最细粒度划分 / ik_max_word 穷尽词库可能

elastic search analysis ik

安装kibana

查看分词器效果

1
2
3
4
5
6
7
8
9
kibana

GET _analyze{

"analyzer":"ik_smart",

"text":"中国共产党人"

}

自定义分词器插件

自己加字典,如何自己加字典?

添加字典:xxx.dic

修改到: ${es_plugins}/ik/config/IkAnalyzer.cfg.xml

class4 rest 分格的API

数据类型

添加文档字段时,可以指定也可以不指定数据类型

字符串类型

text,keyword

数值类型

long,integer,short,byte,double,float,half_float

日期类型

date

boolean类型

boolean

二进制类型

binary

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
建立索引的数据结构存储规则
put http://127.0.0.1:9200/{index}
{
"mappings":{
"properties":{
"name":{
"type":"text"
},
"age":{
"type":"long"
},
"birthday":{
"type":"date"
}
}
}
}

索引的操作API

http method name url param
put 创建一个索引,添加规则 http://127.0.0.1:9200/{index} json body
get 查看所有索引 http://127.0.0.1:9200/_cat/indices?v
get _cat/xxx
get -cluster/xxx
get 查看单个索引 http://127.0.0.1:9200/{index}
delete 删除一个索引 http://127.0.0.1:9200/{index}
post 创建一个默认文档 http://127.0.0.1:9200/{index}/_doc
get 查看默认文档 http://127.0.0.1:9200/{index}/_doc/{doc_id}
put 修改默认文档[不建议] 覆盖式 http://127.0.0.1:9200/{index}/_doc/{doc_id}
post 修改默认文档[单字段修改] http://127.0.0.1:9200/{index}/_doc/{doc_id}/__update
delete 删除默认文档 http://127.0.0.1:9200/{index}/_doc/{doc_id}

文档的操作API

http method name url param
put 创建文档 http://127.0.0.1:9200/{index}/{type}/{document_id}
post 创建随机id文档 http://127.0.0.1:9200/{index}/{type}
get 获取文档 http://127.0.0.1:9200/{index}/{type}/{document_id}
post 更新文档字段 http://127.0.0.1:9200/{index}/{type}/{doc_id}/__update
get 简单匹配查询文档 http://127.0.0.1:9200/{index}/{type}/_search
delete 删除文档 http://127.0.0.1:9200/{index}/{type}/{document_id}
delete 条件删除文档 http://127.0.0.1:9200/{index}/{type}/_delete_by_query
get 查询所有文档 http://127.0.0.1:9200/{index}/{type}/_search 参数不同
get 字段匹配查询 http://127.0.0.1:9200/{index}/{type}/_search 参数不同
get 关键字精确查询 http://127.0.0.1:9200/{index}/{type}/_search 参数不同
get 多关键字精确查询 http://127.0.0.1:9200/{index}/{type}/_search 参数不同
get 指定查询字段 http://127.0.0.1:9200/{index}/{type}/_search
get 过滤字段 http://127.0.0.1:9200/{index}/{type}/_search
get 组合查询 http://127.0.0.1:9200/{index}/{type}/_search
get 范围查询 http://127.0.0.1:9200/{index}/{type}/_search
get 模糊查询 http://127.0.0.1:9200/{index}/{type}/_search
get 单字段排序 http://127.0.0.1:9200/{index}/{type}/_search
get 多字段排序 http://127.0.0.1:9200/{index}/{type}/_search
高亮查询 http://127.0.0.1:9200/{index}/{type}/_search highlight
分页查询 http://127.0.0.1:9200/{index}/{type}/_search
聚合查询 http://127.0.0.1:9200/{index}/{type}/_search
桶聚合查询 http://127.0.0.1:9200/{index}/{type}/_search

映射操作API

ttp method name url param
put 添加映射 http://127.0.0.1:9200/{index}/_mapping
get 查看映射 http://127.0.0.1:9200/{index}/_mapping
put 索引映射关联 http://127.0.0.1:9200/{index}/{type}/{doc_id}/__update

分词器类型

java rest client API

集成思路:

一.java rest sdk就是运用java httpclient把原始的命令行工具封装到request/response/client框架内,每个命令一组request/response,这是一个典型的http restful请求java框架. jar名称:elasticsearch-rest-high-level-client.jar,核心操作对象:TransportClient.java/RestHighLevelClient.java

二.要想跟spring集成,就是把对象实例托管到Context中,spring有spring-data.jar抽象,为elasticsearch提供具体的实现:spring-data-elasticsearch.jar, 核心操作对象:ElasticsearchRestTemplate.java

三.为了能实现自动化配置,用户无需做对象实例化,跟springboot集成autoconfigure模块,springboot把elasticsearch集成到了autoconfigure中,jar名称:spring-boot-starter-data-elasticsearch.jar,核心操作对象没变,只需要在application.yml中配置es的连接信息,就能直接使用elasticsearchRestTemplate.java

class5 springboot集成es

1
2
3
4
5
6
7
8
9
10
11
12
13
14
自动配置包:
maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

spring-boot-autoconfigure.jar

核心包
springframework.boot.autoconfigure.data.elasticsearch
核心类
RestHightLevelClient.java
RestLevelClientConfiguration.java

class6 京东爬虫入库es,全文检索

爬虫

1.写爬虫,根据京东搜索关键字的url去加载查询结果,放到list中.

2.将搜索到结果加入到es的文档库.输入关键字,返回添加是否成功.

3.获取这些数据实现搜索功能,关键字,分页,返回列表.

/条件搜索/ searchRequest SearchSourceBuilder

/分页 sourcebuilder.from(); size()

/精准匹配 TermQueryBuilder sourcebuilder.query(tempquerybuilder); sourcebuilder.timeout

//高亮关键字

/执行搜索

searchRequest.source(sourcebuilder);

client.search(request,requestOptions.default); //SearchResponse

//解析结果

SearchResponse.getHits().getHits().getSourceAsMap();//Map<String,Object>

搜索高亮

​ 高亮关键字/执行搜索/解析结果 //将原来字段替换为高亮的字段

举一反三

要做搜索,只需要把MySQL的数据加入到es,实现搜索全文高亮就行.

FAQ

1.服务启动后es连接失败

java.net.ConnectException: Connection refused

原因:client的jar包版本与server的版本不匹配导致连接失败.client是7.x 而我的服务是6.x

2.批量添加报错:

nested exception is org.elasticsearch.action.ActionRequestValidationException: Validation Failed: 1: type is missing;2: type is missing;3: type is missing;4: type is missing;5: type is missing;6: type is missing;7: type is missing

原因:6.x版本的es,插入索引需要 指定type,7.x之后就不需要了,这是版本差异.

index/type/doc_id

小结

1.es的发展历史

2.es的文件结构

3.安装es

4.生态圈,logstash,kibana

5.分词器ik,自定义分词器

6.restful API操作

7.javaAPI操作

8.springboot集成elasticsearch

9.爬虫爬取jd的关键字搜索

10.模拟全文检索

爬虫->加入es库->搜索es库返回list->高亮显示返回关键字

参考资料

使用Java API实现ES中的索引、映射、文档操作

低版本的elasticsearch中文 guide